import {getInfo, login, logout, register} from '@/api/login'
import {getToken, removeToken, setToken} from '@/utils/auth'
import defAva from '@/static/images/profile.jpg'
import {defineStore} from "pinia";

const USER_KEY = "user";

function getStorageUser() {
    const user = uni.getStorageSync(USER_KEY);
    return user ? JSON.parse(user) : {};
}

function getUserInfo(name) {
    return getStorageUser()[name];
}

function setStorageUser(user) {
    uni.setStorageSync(USER_KEY, JSON.stringify(user));
}


const useUserStore = defineStore(
    'user', {
        state: () => ({
            token: getToken(),
            id: getUserInfo('user')?.userId || '',
            name: getUserInfo('user')?.userName || '',
            nickName: getUserInfo('user')?.nickName || '',
            avatar: getUserInfo('user')?.avatar || defAva,
            roles: getUserInfo('roles') || [],
            permissions: getUserInfo('permissions') || []
        }),
        actions: {
			setAvatar(avatar) {
				this.avator = avatar;
			},
            register(userInfo) {
                const phone = userInfo.phone.trim()
                const password = userInfo.password
                const code = userInfo.code
                const uuid = userInfo.uuid
                return new Promise((resolve, reject) => {
                    register({phone, password, code, uuid, userType: 'app_user'}).then(res => {
                        setToken(res.data.token)
                        this.token = res.data.token
                        resolve()
                    }).catch(error => {
                        console.log(error)
                        reject(error)
                    })
                })
            },
            // 登录
            login(userInfo) {
                const username = userInfo.username.trim()
                const password = userInfo.password
                const code = userInfo.code
                const uuid = userInfo.uuid
                return new Promise((resolve, reject) => {
                    login(username, password, code, uuid).then(res => {
                        setToken(res.data.token)
                        this.token = res.data.token
                        resolve()
                    }).catch(error => {
						console.log(error)
                        reject(error)
                    })
                })
            },
            // 获取用户信息
            getInfo() {
                return new Promise((resolve, reject) => {
                    getInfo().then(res => {
                        const user = res.data.user
                        const avatar = (user.avatar == "" || user.avatar == null) ? defAva : user
                            .avatar;
                        if (res.data.roles && res.data.roles.length > 0) { // 验证返回的roles是否是一个非空数组
                            this.roles = res.data.roles
                            this.permissions = res.data.permissions
                            uni.setStorageSync("user", JSON.stringify(res.data))
                        } else {
                            this.roles = ['ROLE_DEFAULT']
                        }
                        this.id = user.userId
                        this.name = user.userName
                        this.avatar = avatar
                        this.nickName = user.nickName
                        resolve(res)
                    }).catch(error => {
                        reject(error)
                    })
                })
            },
            // 退出系统
            logOut() {
                return new Promise((resolve, reject) => {
                    logout(this.token).then(() => {
                        this.token = ''
                        this.roles = []
                        this.permissions = []
                        uni.removeStorageSync('user');
                        removeToken()
                        resolve()
                    }).catch(error => {
                        reject(error)
                    })
                })
            }
        }
    })

export default useUserStore
